package com.candy.dao;

import java.sql.*;
import java.util.*;

public class DBDriver {
    public static void main(String[] args) {
//        可以将要进行异常处理的代码选中，然后在键盘上按 ctrl+alt+t 选择try catch；idea会将代码补全
        try {
//        操作步骤： （0）下载jdbc驱动包；将驱动包导入项目。 注意：mysql8和mysql5的驱动包版本不通用。
//        （1）注册或实例化jdbc的驱动类
            Class.forName("com.mysql.cj.jdbc.Driver");
//        （2）获取数据库连接对象Connection
//            java链接mysql的连接串
//            mysql8的链接串：jdbc:mysql://localhost:3306/database_name? characterEncoding=utf8 & useSSL=false & serverTimezone=UTC & rewriteBatchedStatements=true
//           连接串中jdbc:mysql表示jdbc链接mysql数据库
//            localhost指代你要链接的数据库的ip地址，此处的localhost指代本机地址，也可以写127.0.0.1
//            database_name指的是要进行链接的数据库的名字
            String url="jdbc:mysql://localhost:3306/sjt_mysql0922?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";
//            mysql的用户名  一般是root
            String username="root";
//            数据库密码，根据自己的密码填写即可
            String userpwd="123456";
           Connection coon= DriverManager.getConnection(url,username,userpwd);
//        （3）获取数据库操作对象Statement（执行增删改查）
           Statement ment= coon.createStatement();
//        （4）执行SQL语句，获取数据操作结果或者结果集对象ResultSet
           ResultSet re= ment.executeQuery("select * from userinfo");
//        （5）解析结果集对象ResultSet，进行相关的业务处理；
//        注意： mysql5和mysql8的连接字符串不一样； 在使用5.x的版本:
//            re.next()如果当前行有数据则返回true，若当前行没有收据，返回false

//            资源关闭后，不能在进行获取，此处需要对数据进行转储
//            准备进行存储数据的容器 采用list+map的方式进行转储
            List<Map<String,Object>> lm=new ArrayList<>();
//获取表结构信息
            ResultSetMetaData rm=re.getMetaData();
//            获取表格共有多少个列
            int count=rm.getColumnCount();
//            准备map存储每一行的数据
            Map<String,Object> eachRow=null;
//进行数据遍历
            while (re.next()){
                eachRow=new HashMap<>();
//                进行遍历每一行的数据，放在map中
                for (int i = 1; i <= count ; i++) {
//                    rm.getColumnName(i)获取该列的列名，re.getObject(rm.getColumnName(i))通过列名获取该列的值
                    eachRow.put(rm.getColumnName(i),re.getObject(rm.getColumnName(i)));
                }
                lm.add(eachRow);
            }
//            (6)关闭相应资源
            re.close();
            ment.close( );
            coon.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
